/**
 * 判断是否合法电话号码
 * @param {string} idCard 电话号码
 * @returns {boolean} 是否合法
 */
export function validatePhoneNumber(phoneNumber) {
  const phoneRegex = /^1[3-9]\d{9}$/;
  return phoneRegex.test(phoneNumber);
}

/**
 * 判断是否为合法身份证号码
 * @param {string} idCard 身份证号码
 * @returns {boolean} 是否合法
 */
export function validIdCard(idCard) {
  // 正则表达式匹配规则，包含15位和18位身份证号码
  const idCardRegex = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/;
  if (!idCardRegex.test(idCard)) {
    // 不符合基本的格式要求，直接返回false
    return false;
  }

  // 处理18位身份证号码的校验
  if (idCard.length === 18) {
    // 校验码字符集
    const chars = '10X98765432';
    // 加权因子
    const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    // 计算校验位
    let sum = 0;
    for (let i = 0; i < 17; i++) {
      sum += parseInt(idCard.charAt(i)) * factors[i];
    }
    const mod = sum % 11;
    const checkBit = chars.charAt(mod);

    // 检查校验位是否匹配
    return idCard.charAt(17).toUpperCase() === checkBit;
  }

  return true; // 15位身份证号码不需要校验
}

/**
 * 判断是否为有效的 URL
 * @param {string} url 地址
 * @returns {boolean} 是否有效
 */
export function validUrl(url) {
  const pattern = new RegExp(
    "^(https?:\\/\\/)?" + // protocol
    "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|" + // domain name
    "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
    "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
    "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
    "(\\#[-a-z\\d_]*)?$", // fragment locator
    "i"
  );
  return !!pattern.test(url);
}